package cn.edu.xust.manager.controller;

import cn.edu.xust.manager.entity.User;
import cn.edu.xust.manager.mapper.UserMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import jakarta.servlet.http.HttpSession;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.List;

@Log
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @GetMapping("/register")
    public String signUpPage() {
        log.info("打开注册页面");
        // prefix + 视图名称 + suffix
        return "register"; // "/templates/" + "register" + ".html"
    }

    @PostMapping("/register")
    public String signUp(User user, String confirm, Model model) {
        log.info( user.toString() );
        log.info("confirm: " + confirm);
        // 创建一个查询包装器
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 指定查询条件，作用相当于 SQL 语句中的 WHERE email = ?
        wrapper.eq("email", user.getEmail());
        // 如果邮箱在数据库中已经存在，则表示该邮箱不可再注册
        if( userMapper.exists(wrapper) ) {
            model.addAttribute("message", "邮箱已经被占用");
            return "register"; // "/templates/" + "register" + ".html"
        }
        // 若用户两次输入的密码相同
        if(confirm.equals(user.getPassword())){
            // 则将用户数据保存到数据库中
            userMapper.insert(user);
            // 注册成功后，则跳转到登录页面
            return "login"; // "/templates/" + "login" + ".html"
        }
        // 通过 Model 实例向页面传递数据
        model.addAttribute("message", "你两次输入的密码不一致");
        // 若用户输入的密码不相同则重新返回到注册页面
        return "register"; // "/templates/" + "register" + ".html"
    }

    @GetMapping("/login")
    public String signInPage() {
        log.info("打开登录页面");
        // prefix + 视图名称 + suffix
        return "login"; // "/templates/" + "login" + ".html"
    }

    @PostMapping("login")
    public String signInAction(User user, HttpSession session, RedirectAttributes ra) {
        // 创建一个查询包装器
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 指定查询条件，作用相当于 SQL 语句中的 WHERE email = ?
        wrapper.eq("email", user.getEmail());
        // 根据邮箱查询用户信息
        User udb = userMapper.selectOne(wrapper);
        if( udb == null) {
            // 使用 RedirectAttributes 暂存提示信息
            ra.addFlashAttribute("message", "邮箱在数据库中不存在");
            // 重定向到登录页面
            return "redirect:/user/login"; // 浏览器会以GET方式打开 /user/login
        }
        // 如果 页面上输入的密码 跟 数据库中存储的密码 【不相同】
        if( !user.getPassword().equals(udb.getPassword()) ) {
            // 将邮箱存储到 RedirectAttributes 以便于在页面上展示
            ra.addFlashAttribute("email", user.getEmail());
            // 设置密码错误的提示信息
            ra.addFlashAttribute("message", "密码错误");
            return "redirect:/user/login";
        }
        // 将 用户 设置到 会话 中
        session.setAttribute("user", udb);
        return "redirect:/user/home";
    }

    @GetMapping("/home")
    public String userList(Model model) {
        // 创建查询包装器
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 设置排序方式，等同于 SQL 语句中的 ORDER BY 语句
        wrapper.orderByAsc("id");// ORDER BY id ASC
        // 查询数据库获取用户列表
        List<User> list = userMapper.selectList(wrapper);
        // 将用户列表添加到 Model 中 (将来在页面上可以通过${users}来获取)
        model.addAttribute("users", list);
        // 返回视图名称  //   prefix      + 视图名称 + suffix
        return "home"; // "/templates/" + "home" + ".html"
    }

    @GetMapping("/logout")
    public String logout(HttpSession session) {
        // 从会话对象中删除已登录用户的信息
        session.removeAttribute("user");
        // 重定向到用户列表页面
        return "redirect:/user/home";
    }

    @GetMapping("/remove/{uid}")
    public String remove(@PathVariable("uid") Long id) {
        // 根据ID删除数据
        userMapper.deleteById(id);
        // 重定向到用户列表页面
        return "redirect:/user/home";
    }

    @GetMapping("/change/{uid}")
    public String changePage(@PathVariable("uid") Long id, Model model) {
        // 根据 ID 查询单个用户信息
        User udb = userMapper.selectById(id);
        // 若 ID 对应的用户不存在则重新返回列表
        if( udb == null ) {
            return "redirect:/user/home";
        }
        // 将从数据库获取到的 User 对象添加到 Model 中
        model.addAttribute("user", udb);
        // 返回 change 视图名称，打开编辑页面
        return "change"; // "/templates/" + "change" + ".html"
    }

    @PostMapping("/update")
    public String changeAction(User user, String confirm, Model model, RedirectAttributes ra) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("email", user.getEmail()); // email = 'abc@hello.com'
        wrapper.ne("id", user.getId()); // id != 1894289197101350913
        // 若邮箱已经被占用，则返回到修改页面并给出提示
        if( userMapper.exists(wrapper) ) {
            model.addAttribute("message", "邮箱已经被占用");
            return "change"; // "/templates/" + "change" + ".html"
        }
        // 若两次密码不一致，则返回修改页面并给出提示
        if( !confirm.equals(user.getPassword()) ){
            model.addAttribute("message", "两次输入密码不一致");
            return "change"; // "/templates/" + "change" + ".html"
        }

        // 修改用户信息
        userMapper.updateById(user);
        // 通过 RedirectAttributes 向 用户列表页面 传递提示信息
        ra.addFlashAttribute("message", "修改成功");
        // 修改成功后重定向到 用户列表页面
        return "redirect:/user/home";
    }

}
